package com.vclee.fast.utils;

import com.vclee.fast.utils.exception.Assert;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.stream.Collectors;

public class CommonUtils {

    /**
     * 生成长度位6的验证码或者密码
     */
    public static String generatorAuthCode(){
        return String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
    }


    /**
     * 生成随机字符串
     * @param length 字符串长度
     */
    public static String generatorChinaWords(Integer length) {
        try {
            StringBuilder buffer = new StringBuilder();
            for (int i = 0; i < length; i++) {
                int highPos, lowPos;
                Random random = new Random();
                highPos = (176 + Math.abs(random.nextInt(50)));// 区码，0xA0打头，从第16区开始，即0xB0=11*16=176,16~55一级汉字，56~87二级汉字
                lowPos = 160 + Math.abs(random.nextInt(94)); // 位码，0xA0打头，范围第1~94列
                byte[] bArr = new byte[2];
                bArr[0] = (new Integer(highPos)).byteValue();
                bArr[1] = (new Integer(lowPos)).byteValue();
                buffer.append(new String(bArr, "GB2312"));
            }
            return buffer.toString();
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }

    /**
     * 生成随机女性角色名字
     */
    public static String generatorWomanChinaNickName(){
          String[] surName = {
                "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "楮", "卫", "蒋", "沈", "韩", "杨",
                "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
                "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
                "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
                "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
                "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
                "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
                "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁",
                "杜", "阮", "蓝", "闽", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭",
                "梅", "盛", "林", "刁", "锺", "徐", "丘", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
                "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗",
                "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
                "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "麹", "家", "封",
                "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
                "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
                "宁", "仇", "栾", "暴", "甘", "斜", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙",
                "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
                "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
                "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
                "郤", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
                "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
                "向", "古", "易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘",
                "匡", "国", "文", "寇", "广", "禄", "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆",
                "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
                "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红",
                "游", "竺", "权", "逑", "盖", "益", "桓", "公", "晋", "楚", "阎", "法", "汝", "鄢", "涂", "钦",
                "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "商", "牟", "佘", "佴", "伯", "赏", "墨", "哈",
                "谯", "笪", "年", "爱", "阳", "佟"};
         String[] doubleSurName = {"万俟", "司马", "上官", "欧阳", "夏侯", "诸葛",  "东方", "赫连", "皇甫", "尉迟", "澹台",
                "公冶",  "淳于", "单于", "公孙", "仲孙", "轩辕", "令狐",  "宇文", "长孙", "慕容", "鲜于",  "司徒","拓拔", "南宫"};

         String[] word = {"夏菡","曼香","若烟","半梦","雅绿","冰蓝","灵槐","平安","书翠","晓翠","香巧","芸芸",
                "巧巧","晓梦","凝寒","访旋","亦玉","凌萱","访卉","怀亦","笑蓝","春翠","靖柏","书雪","乐枫","念薇","靖雁","寻春",
                "小三","从寒","忆香","觅波","静曼","凡旋","新波","代真","新蕾","雁玉","冷卉","紫山","千琴","恨天","傲芙","盼山","怀蝶",
                "冰兰","问旋","问筠","如霜","半芹","寒雁","怜云","寻文","谷雪","乐萱","涵菡","海莲","傲蕾","青槐","冬儿","易梦","惜雪",
                "宛海","之柔","夏青","铃","萱","璇","梦","菲","雪见","雪","灵","芙蓉"};


        int surLen = surName.length;
        int dSurLen = doubleSurName.length;
        int nameLen = word.length;
        Random random =new Random();
        int a1 = random.nextInt(2);
        if(a1==0){
            return surName[random.nextInt(surLen)]+word[random.nextInt(nameLen)];
        }
        return doubleSurName[random.nextInt(dSurLen)]+word[random.nextInt(nameLen)];
    }

    /**
     * 生成密码15-18位的随机密码
     */
    public static String generatorPassword(){
        StringBuilder builder = new StringBuilder();
        String[] words = {
                ",", "+", ".", "*", "?", "%", "^", "!", "@", "#", "$", "&", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
        };
        Random random = new Random();
        builder.append(words[random.nextInt(26)+48]);// 首位大写字母
        for (int i = 0; i < (random.nextInt(3) + 10); i++)  builder.append(words[random.nextInt(words.length)]);
        builder.append(words[random.nextInt(10)]);     // 特殊字符
        builder.append(words[random.nextInt(10)+12]); // 数字
        builder.append(words[random.nextInt(26)+22]); // 小写字母
        return builder.toString();
    }

    /**
     * 将数组转化为数组元素加分隔符字符串
     * @param iterable 数组
     * @param separator 分隔符
     * @return 返回数组元素加分隔符字符串
     */
    public static String arrToStr(Iterable<?> iterable, String separator) {
        if (iterable != null) {
            Iterator<?> iterator = iterable.iterator();
            if (iterator.hasNext()) {
                Object first = iterator.next();
                if (!iterator.hasNext()) {
                    return Objects.toString(first, "");
                } else {
                    StringBuilder buf = new StringBuilder(256);
                    if (first != null) {
                        buf.append(first);
                    }
                    while (iterator.hasNext()) {
                        if (separator != null) {
                            buf.append(separator);
                        }
                        Object obj = iterator.next();
                        if (obj != null) {
                            buf.append(obj);
                        }
                    }
                    return buf.toString();
                }
            }
            return "";
        }
        return null;
    }

    public static Map<String, Object> xmlToMap(String xmlStr) {
        Map<String, Object> msg = new HashMap<>();
        try {
            Document doc = DocumentHelper.parseText(xmlStr);
            Element root = Objects.requireNonNull(doc).getRootElement();
            for (Iterator<?> iterator = root.elementIterator(); iterator.hasNext(); ) {
                Element e = (Element) iterator.next();
                List<?> list = e.elements();
                if (list.isEmpty()) {
                    msg.put(e.getName(), e.getText());
                } else{
                    msg.put(e.getName(), Dom2Map(e));
                }
            }
        } catch (DocumentException ignored) {
        }

        return msg;
    }

    private static Map<String, Object> Dom2Map(Element e) {
        Map<String, Object> map = new HashMap<>();
        List<?> list = e.elements();
        if (!list.isEmpty()) {
            for (Object object : list) {
                Element iter = (Element) object;
                List<Object> mapList = new ArrayList<>();
                if (!iter.elements().isEmpty()) {
                    Map<String, Object> m = Dom2Map(iter);
                    if (map.get(iter.getName()) != null) {
                        Object obj = map.get(iter.getName());
                        if (!obj.getClass().getName().equals("java.utils.ArrayList")) {
                            mapList = new ArrayList<>();
                            mapList.add(obj);
                            mapList.add(m);
                        }
                        if (obj.getClass().getName().equals("java.utils.ArrayList")) {
                            mapList = (List) obj;
                            mapList.add(m);
                        }
                        map.put(iter.getName(), mapList);
                    } else
                        map.put(iter.getName(), m);
                } else {
                    if (map.get(iter.getName()) != null) {
                        Object obj = map.get(iter.getName());
                        if (!obj.getClass().getName().equals("java.utils.ArrayList")) {
                            mapList = new ArrayList<>();
                            mapList.add(obj);
                            mapList.add(iter.getText());
                        }
                        if (obj.getClass().getName().equals("java.utils.ArrayList")) {
                            mapList = (List) obj;
                            mapList.add(iter.getText());
                        }
                        map.put(iter.getName(), mapList);
                    } else
                        map.put(iter.getName(), iter.getText());
                }
            }
        } else
            map.put(e.getName(), e.getText());
        return map;
    }


    public static Long getSerialNo(String shortNo) {
        return Long.valueOf(new StringBuffer(shortNo.toLowerCase()).reverse().toString(),32)-1500000102L;
    }

    /**
     * 长度为7支持99亿以内的任何数字
     */
    public static String getShortNo(Long serial) {
        return new StringBuffer(Long.toString(serial+1500000102L,32)).reverse().toString().toUpperCase();
    }
    public static List<Integer> strArrToIntList(String ids) {
        List<Integer> list= new ArrayList<>();
        if(Assert.notBlank(ids)){
            list = Arrays.stream(ids.split(","))
                    .map(Integer::parseInt).collect(Collectors.toList());
        }
        return list;
    }
}
